﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PrzetwarzanieObrazow
{
    class Macierz
    {
        private int [,] xy;
        private int[,] duplikacjaxy;
        private int x,y;
        private int dx,dy;
        public Macierz(int rx, int ry)
        {
            x = rx;
            y = ry;
            xy = new int[rx,ry];
            duplikuj();
        }
        public int this [int rx, int ry]
        {
            get { return xy[rx,ry]; }
            set { xy[rx,ry]=value; }
        }
        private void duplikuj()
        {
            //duplikacja bocznych krawędzi o 20, czyli maksymaly element może być 41 na 41
            dx = x + 20;
            dy = y + 20;
            duplikacjaxy = new int[dx, dy];
            for (int i = 0; i < x; i++)//góra
                for (int j = 0; j < 20; j++)
                    duplikacjaxy[i + 20, j] = xy[i, 0];

            for (int i = 0; i < x; i++)//dół
                for (int j = 0; j < 20; j++)
                    duplikacjaxy[i + 20, j+y] = xy[i, y-1];

            for (int i = 0; i < 20; i++)//lewy bok
                for (int j = 0; j < y; j++)
                    duplikacjaxy[i , j+20] = xy[0, j];

            for (int i = 0; i < 20; i++)//prawy bok
                for (int j = 0; j < y; j++)
                    duplikacjaxy[i + x, j+20] = xy[x-1, j];

            for (int i = 0; i < 20; i++)//lewy górny róg
                for (int j = 0; j < 20; j++)
                    duplikacjaxy[i , j] = xy[0, 0];

            for (int i = x; i < dx; i++)//prawy górny róg
                for (int j = 0; j < 20; j++)
                    duplikacjaxy[i, j] = xy[x-1, 0];

            for (int i = 0; i < 20; i++)//lewy dolny róg
                for (int j = y; j < dy; j++)
                    duplikacjaxy[i, j] = xy[0, y-1];

            for (int i = x; i < dx; i++)//prawy dolny róg
                for (int j = y; j < dy; j++)
                    duplikacjaxy[i, j] = xy[x-1, y-1];

        }
        private void obetnij()//a dokładnie skopiuj środek duplikacjaxy do xy
        {
            for (int i = 0; i < x; i++)
                for (int j = 0; j < y; j++)
                    duplikacjaxy[i, j] = xy[i+20, j+20];
        }
        //najważniejsze jest mnożenie macierzy żeby na rogach działało, bez względu na rozmiar, ale najpierw dodawanie
        public void dodaj(int liczba)
        {
            for (int i = 0; i < x; i++)
                for (int j = 0; j < y; j++)
                    xy[x, y] += liczba;
        }
        public void mnoz(int liczba)
        {
            for (int i = 0; i < x; i++)
                for (int j = 0; j < y; j++)
                    xy[x, y] *= liczba;
        }
        public void mnozprzezelement(Macierz mx)
        {
            //Tutaj mnożenie przez element strukturalny, element tem może mieć różne rozmiary i trzeba jakos to obsłużyć
            //trzeba zduplikować punkty będące na brzegu, lub obciąc je, albo pominąć je,ale najlepiej zduplikować
            decimal c = mx.x / 2;
            int srodek = Convert.ToInt32(Math.Ceiling(c));
            //int odleglosc;
            for (int i = 0; i < x; i++)
                for (int j = 0; j < y; j++)
                    xy[i, j] = razyelement(i, j, mx);//mnożymy ity i jty element przez macierz mx, w nowej metodzie
        }
        private int razyelement(int ii, int ij, Macierz mx)
        {
            int startx = ii - mx.x;
            int starty = ij - mx.y;
            double suma = 0;
            for (int i = startx; i < mx.x + startx; i++)
                for (int j = starty; j < mx.y + starty; j++)
                    suma+=duplikacjaxy[i, j] * mx[i, j];
            int dziel = mx.x * mx.y;
            double wynik = suma / dziel;
            int res = Convert.ToInt32(wynik);
            return res;
        }
    }
}
